﻿using System;
using System.Collections;
using System.Data;
using System.Collections.Generic;

namespace ATSBLL
{
    public class JoinCls
    {
        //public static DataTable Join(DataTable First, DataTable Second, DataColumnCollection FJC, DataColumnCollection SJC)
        //{
        //    //创建一个新的DataTable
        //    DataTable table = new DataTable("Join");

        //    // Use a DataSet to leverage DataRelation
        //    using (DataSet ds = new DataSet())
        //    {
        //        //把DataTable Copy到DataSet中
        //        ds.Tables.AddRange(new DataTable[] { First.Copy(), Second.Copy() });
        //        DataColumn[] parentcolumns = new DataColumn[FJC.Count];
        //        for (int i = 0; i < parentcolumns.Length; i++)
        //        {
        //            parentcolumns[i] = ds.Tables[0].Columns[FJC[i].ColumnName];
        //        }
        //        DataColumn[] childcolumns = new DataColumn[SJC.Count];
        //        for (int i = 0; i < childcolumns.Length; i++)
        //        {
        //            childcolumns[i] = ds.Tables[1].Columns[SJC[i].ColumnName];
        //        }
        //        //创建关联
        //       // DataRelation r = new DataRelation(string.Empty, parentcolumns, childcolumns, false);
        //        DataRelation r2 = new DataRelation(string.Empty, parentcolumns[5], childcolumns[5], false);
        //        DataRelation r = new DataRelation(string.Empty, parentcolumns[2], childcolumns[2], false);

        //        ds.Relations.Add(r2);
        //        ds.Relations.Add(r);
                

        //        //为关联表创建列
        //        for (int i = 0; i < First.Columns.Count; i++)
        //        {
        //            table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
        //        }
        //        for (int i = 0; i < Second.Columns.Count; i++)
        //        {
        //            //看看有没有重复的列，如果有在第二个DataTable的Column的列明后加_Second
        //            if (!table.Columns.Contains(Second.Columns[i].ColumnName))
        //                table.Columns.Add(Second.Columns[i].ColumnName, Second.Columns[i].DataType);
        //            else
        //                table.Columns.Add(Second.Columns[i].ColumnName + "_Second", Second.Columns[i].DataType);
        //        }
        //        table.BeginLoadData();
        //        foreach (DataRow firstrow in ds.Tables[0].Rows)
        //        {
        //            //得到行的数据
        //            DataRow[] childrows = firstrow.GetChildRows(r);
        //            if (childrows != null && childrows.Length > 0)
        //            {
        //                object[] parentarray = firstrow.ItemArray;
        //                foreach (DataRow secondrow in childrows)
        //                {
        //                    object[] secondarray = secondrow.ItemArray;
        //                    object[] joinarray = new object[parentarray.Length + secondarray.Length];
        //                    Array.Copy(parentarray, 0, joinarray, 0, parentarray.Length);
        //                    Array.Copy(secondarray, 0, joinarray, parentarray.Length, secondarray.Length);
        //                    table.LoadDataRow(joinarray, true);
        //                }
        //            }
        //        }
        //        table.EndLoadData();
        //    }

        //    return table;
        //}


        //public static ArrayList DataSetToArrayList(int ColumnIndex, DataTable dataTable)
        //{
        //    ArrayList output = new ArrayList();

        //    foreach (DataRow row in dataTable.Rows)
        //        output.Add(row[ColumnIndex]);

        //    return output;
        //}

        public static DataTable myJoinMethod(DataTable LeftTable, DataTable RightTable)
        {
            // Step1: 建立一张新表将电性能和交调的表的列都整合到一起 
            DataSet mydataSet = new DataSet();
            mydataSet.Tables.Add("  ");
            DataTable myDataTable = mydataSet.Tables[0];

            // Step2: 将交调表的所有列名添加进新表中
            DataColumn[] dcLeftTableColumns = new DataColumn[LeftTable.Columns.Count];
            LeftTable.Columns.CopyTo(dcLeftTableColumns, 0);

            foreach (DataColumn LeftTableColumn in dcLeftTableColumns)
            {
                if (!myDataTable.Columns.Contains(LeftTableColumn.ToString()))
                    myDataTable.Columns.Add(LeftTableColumn.ToString());
            }

            // Step3: 将电性能表中所有不重复的列名添加进新表中
            DataColumn[] dcRightTableColumns = new DataColumn[RightTable.Columns.Count];
            RightTable.Columns.CopyTo(dcRightTableColumns, 0);

            foreach (DataColumn RightTableColumn in dcRightTableColumns)
            {
                if (!myDataTable.Columns.Contains(RightTableColumn.ToString()))
                {
                    myDataTable.Columns.Add(RightTableColumn.ToString());
                }
            }

            // Step4: 判断电性能表和交调表是否为空表
            if (LeftTable.Rows.Count == 0 || RightTable.Rows.Count == 0)
            {
                // Step4.1: 交调表不为空表
                if (LeftTable.Rows.Count != 0)
                {
                    //将交调中的数据行添加进新表中
                    foreach (DataRow LeftTableDataRows in LeftTable.Rows)
                    {
                        myDataTable.ImportRow(LeftTableDataRows);
                    }
                }

                // Step4.2: 电性能不为空表
                if (RightTable.Rows.Count != 0)
                {
                    //将电性能表表中的数据行添加进新表中
                    foreach (DataRow RightTableDataRows in RightTable.Rows)
                    {
                        myDataTable.ImportRow(RightTableDataRows);
                    }
                }
            } 

            else
            {
                int iIndexs = 0;
                int i = 0;
                int j = 0;
                string wherecondition = "";
                DataRow[] dr;
                DataRow[] drs;
                DataRow[] drl;

             

                //将交调表表中的数据行添加进新表中
                foreach (DataRow LeftTableDataRows in LeftTable.Rows)
                {
                    myDataTable.ImportRow(LeftTableDataRows);
                }
                string mt = "";
                string rt = "";
                for (int f = 0; f < myDataTable.Rows.Count; f++)
                { 
                    mt = myDataTable.Rows[f]["ProductSN"].ToString();
                    wherecondition = "[ProductSN]='"
                               + mt + "'";
                    drl = RightTable.Select(wherecondition);  //根据交调表中的数据查找对应电性能表中数据
                    if (drl.Length == 0)
                    {
                        DataRow rowr = RightTable.NewRow(); 
                        if ((myDataTable.Rows[f]["ProductSN"]).Equals(myDataTable.Rows[f+1]["ProductSN"]))
                            RightTable.Rows.InsertAt(rowr, f -1);
                        else
                            RightTable.Rows.InsertAt(rowr, f-9);
                    }

                }  
                
            
                #region 将交调表表中的“条码”，到电性能表中查找，如果找到相同的则添加在后面，否则添加进新行
                //    foreach (DataRow rightTableDataRows in RightTable.Rows)
                //    {
                //        i++;
                //        wherecondition = "[ProductSN]='"
                //                    + rightTableDataRows[2].ToString() + "'"
                //                    ;//和“产品状态”+ " and [PIMTestStep]='" + rightTableDataRows[4].ToString() + "'"

                //        dr = myDataTable.Select(wherecondition);
                //        drs = RightTable.Select(wherecondition);
                //        if (dr.Length != 0 && drs.Length!=0)
                //        {
                //            if (dr.Length == drs.Length)//交调数据和电性能数据相等
                //            {
                //                iIndexs = i;//myDataTable.Rows.IndexOf(dr[i]);  
                //                foreach (DataColumn dc in RightTable.Columns)
                //                {
                //                    if (dc.Ordinal != 0)
                //                        myDataTable.Rows[iIndexs][dc.ColumnName.ToString()] =
                //                rightTableDataRows[dc.ColumnName.ToString()].ToString();

                //                }
                //            }
                //            else if (dr.Length != drs.Length)//交调数据大于电性能数据等或者电性能数据大交调
                //            {
                //                DataRow row = myDataTable.NewRow();
                //                row[0] = rightTableDataRows[0].ToString();
                //                row[1] = rightTableDataRows[1].ToString();
                //                row[2] = rightTableDataRows[2].ToString();
                //                #region 同一个产品序列号电性能测试数大于交调测试条数
                //                if (drs.Length > 1)
                //                {
                //                    j++;
                //                    //myDataTable.Rows.Add(row); 
                //                    myDataTable.Rows.InsertAt(row, i);  //添加指定位置
                //                    dr = myDataTable.Select();
                //                    iIndexs = myDataTable.Rows.IndexOf(dr[i]);
                //                    if (j > 1)
                //                    {

                //                        foreach (DataColumn dc in RightTable.Columns)
                //                        {
                //                            if (dc.Ordinal != 0)
                //                                myDataTable.Rows[iIndexs][dc.ColumnName.ToString()] =
                //                              rightTableDataRows[dc.ColumnName.ToString()].ToString();
                //                        }
                //                    }
                //                    else
                //                    {
                //                        foreach (DataColumn dc in RightTable.Columns)
                //                        {
                //                            if (dc.Ordinal != 0)
                //                                myDataTable.Rows[iIndexs][dc.ColumnName.ToString()] =
                //                         rightTableDataRows[dc.ColumnName.ToString()].ToString();
                //                        }
                //                    }

                //                }
                //                #endregion
                //                #region 同一个产品序列号交调测试条数大于电性能测试数
                //                else
                //                {
                //                    if (dr.Length > 1) //交调表测试条数 >电性能测试条数
                //                    {
                //                        for (int k= 0; k < RightTable.Rows.Count; k++)
                //                        {


                //                        }
                //                        DataTable dt = RightTable;
                //                        row = dt.NewRow();
                //                        dt.Rows.InsertAt(row, i);  //添加指定位置
                //                        dr = RightTable.Select();

                //                    }
                //                    else
                //                    {
                //                        iIndexs = i; // myDataTable.Rows.IndexOf(dr[i]);
                //                        foreach (DataColumn dc in RightTable.Columns)
                //                        {
                //                            if (dc.Ordinal != 0)
                //                                myDataTable.Rows[iIndexs][dc.ColumnName.ToString()] =
                //                          rightTableDataRows[dc.ColumnName.ToString()].ToString();
                //                        }
                //                    }
                //                }
                //                #endregion
                //            }
                //            else
                //            {
                //                int iIndex = myDataTable.Rows.IndexOf(dr[0]);
                //                foreach (DataColumn dc in RightTable.Columns)
                //                {
                //                    if (dc.Ordinal != 0)
                //                        myDataTable.Rows[iIndex][dc.ColumnName.ToString()] =
                //                rightTableDataRows[dc.ColumnName.ToString()].ToString();

                //                }
                //            }
                //        }
                //        else
                //        {
                //            int count = myDataTable.Rows.Count;
                //            DataRow row = myDataTable.NewRow();
                //            row[0] = rightTableDataRows[0].ToString();
                //            myDataTable.Rows.Add(row);
                //            foreach (DataColumn dc in RightTable.Columns)
                //            {
                //                if (dc.Ordinal != 0)
                //                    myDataTable.Rows[count][dc.ColumnName.ToString()] =
                //            rightTableDataRows[dc.ColumnName.ToString()].ToString();
                //            }
                //        }


                //    }

                #endregion   



                #region 将电性能表中的条码 到交调表中查找 如果找到相同的添加在后面 否则添加进新行
                for (int k = 0; k < RightTable.Rows.Count; k++)
                {
                    wherecondition = "[ProductSN]='"
                                + RightTable.Rows[k]["ProductSN"].ToString() + "'";
                    dr = myDataTable.Select(wherecondition); //交调
                    drs = RightTable.Select(wherecondition); //电性能  

                    if (dr.Length != 0 && drs.Length != 0)
                    {
                        if (dr.Length == drs.Length)//交调数据和电性能数据相等
                        {
                            iIndexs = k;//myDataTable.Rows.IndexOf(dr[i]);  
                            foreach (DataColumn dc in RightTable.Columns)
                            {
                                if (dc.Ordinal != 0)
                                    myDataTable.Rows[iIndexs][dc.ColumnName.ToString()] =
                               RightTable.Rows[k][dc.ColumnName.ToString()].ToString();

                            }
                        }
                        else if (dr.Length != drs.Length)//交调数据大于电性能数据等或者电性能数据大交调
                        {
                            DataRow row = myDataTable.NewRow();
                            row[0] = RightTable.Rows[k]["ProductTypeID"].ToString();
                            row[1] = RightTable.Rows[k]["MOID"].ToString();
                            row[2] = RightTable.Rows[k]["ProductSN"].ToString();
                            #region 同一个产品序列号电性能测试数大于交调测试条数
                            if (drs.Length > 1)
                            {

                                j++;
                                //myDataTable.Rows.Add(row); 
                                myDataTable.Rows.InsertAt(row, k);  //添加指定位置
                                dr = myDataTable.Select();
                                iIndexs = myDataTable.Rows.IndexOf(dr[k]);
                                if (j > 1)
                                {

                                    foreach (DataColumn dc in RightTable.Columns)
                                    {
                                        if (dc.Ordinal != 0)
                                            myDataTable.Rows[iIndexs][dc.ColumnName.ToString()] =
                                         RightTable.Rows[k][dc.ColumnName.ToString()].ToString();
                                    }
                                }
                                else
                                {
                                    foreach (DataColumn dc in RightTable.Columns)
                                    {
                                        if (dc.Ordinal != 0)
                                            myDataTable.Rows[iIndexs][dc.ColumnName.ToString()] =
                                     RightTable.Rows[k][dc.ColumnName.ToString()].ToString();
                                    }
                                }

                            }
                            #endregion
                            #region 同一产品序列号只电性能的
                            else if (dr.Length == 0)
                            {
                                myDataTable.Rows.InsertAt(row, k);  //添加指定位置
                            }
                            #endregion 
                            #region 同一个产品序列号交调测试条数大于电性能测试数
                            else
                            {
                                if (dr.Length > 1) //交调表测试条数 >电性能测试条数
                                {

                                    DataRow rowr = RightTable.NewRow();
                                    if (k > 0)
                                    {
                                        RightTable.Rows.InsertAt(rowr, k + 1);
                                    }  //添加指定位置  

                                    foreach (DataColumn dc in RightTable.Columns)
                                    {
                                        if (dc.Ordinal != 0)
                                            if (k > 0)
                                            {
                                                myDataTable.Rows[iIndexs + 1][dc.ColumnName.ToString()] =
                                             RightTable.Rows[k][dc.ColumnName.ToString()].ToString();
                                            }
                                            else
                                            {
                                                myDataTable.Rows[iIndexs][dc.ColumnName.ToString()] =
                                               RightTable.Rows[k][dc.ColumnName.ToString()].ToString();
                                            }
                                    }
                                }
                                else
                                {
                                    iIndexs = k; // myDataTable.Rows.IndexOf(dr[i]);
                                    foreach (DataColumn dc in RightTable.Columns)
                                    {
                                        if (dc.Ordinal != 0)
                                            myDataTable.Rows[iIndexs][dc.ColumnName.ToString()] =
                                      RightTable.Rows[k][dc.ColumnName.ToString()].ToString();
                                    }
                                }
                            }
                            #endregion

                        }
                        else
                        {
                            int count = myDataTable.Rows.Count;
                            DataRow row = myDataTable.NewRow();
                            row[0] = RightTable.Rows[k][0].ToString();
                            myDataTable.Rows.Add(row);
                            foreach (DataColumn dc in RightTable.Columns)
                            {
                                if (dc.Ordinal != 0)
                                    myDataTable.Rows[count][dc.ColumnName.ToString()] =
                            RightTable.Rows[k][dc.ColumnName.ToString()].ToString();
                            }
                        }
                    } 
                }
                #endregion
            }
            myDataTable = ChangeColName(myDataTable);
            return myDataTable;
        }

 
        public static DataTable ChangeColName(DataTable myTable)
        {
            if (myTable.Columns.Contains("ProductTypeID"))
                myTable.Columns["ProductTypeID"].ColumnName = "产品代码";

            if (myTable.Columns.Contains("MOID"))
                myTable.Columns["MOID"].ColumnName = "批次(MO)";

            if (myTable.Columns.Contains("ProductSN"))
                myTable.Columns["ProductSN"].ColumnName = "产品序列号"; 

            if (myTable.Columns.Contains("RecordTime"))
                myTable.Columns["RecordTime"].ColumnName = "测试时间(电性能)";

            if (myTable.Columns.Contains("UserID"))
                myTable.Columns["UserID"].ColumnName = "测试员(电性能)";
            if (myTable.Columns.Contains("UserID2"))
                myTable.Columns["UserID2"].ColumnName = "测试员2(电性能)";

            if (myTable.Columns.Contains("TestStep"))
                myTable.Columns["TestStep"].ColumnName = "测试阶段(电性能)";

            if (myTable.Columns.Contains("ALLStatus"))
                myTable.Columns["ALLStatus"].ColumnName = "判定(电性能)"; 

            if (myTable.Columns.Contains("ElecStatus"))
                myTable.Columns["ElecStatus"].ColumnName = "模块是否校准";

            if (myTable.Columns.Contains("CodeStatus"))
                myTable.Columns["CodeStatus"].ColumnName = "模块标签匹配不合格";

            if (myTable.Columns.Contains("WaveStatus"))
                myTable.Columns["WaveStatus"].ColumnName = "波形一致不变";

            if (myTable.Columns.Contains("MaxVSWR"))
                myTable.Columns["MaxVSWR"].ColumnName = "MAX驻波";

            if (myTable.Columns.Contains("MaxISO"))
                myTable.Columns["MaxISO"].ColumnName = "MIN隔离";

            if (myTable.Columns.Contains("MaxPhase"))
                myTable.Columns["MaxPhase"].ColumnName = "MAX相位偏差";
            if (myTable.Columns.Contains("MaxAm"))
                myTable.Columns["MaxAm"].ColumnName = "MAX幅度(耦合)偏差";
            if (myTable.Columns.Contains("MaxMag"))
                myTable.Columns["MaxMag"].ColumnName = "MAX耦合度指标(26±2)偏差"; 
            if (myTable.Columns.Contains("MaxInsertloss"))
                myTable.Columns["MaxInsertloss"].ColumnName = "MAX插损";

            if (myTable.Columns.Contains("PIMRecordTime"))
                myTable.Columns["PIMRecordTime"].ColumnName = "测试时间(交调)";

            if (myTable.Columns.Contains("PIMUserID"))
                myTable.Columns["PIMUserID"].ColumnName = "测试员(交调)";
            if (myTable.Columns.Contains("PIMUserID2"))
                myTable.Columns["PIMUserID2"].ColumnName = "测试员2(交调)";

            if (myTable.Columns.Contains("PIMTestStep"))
                myTable.Columns["PIMTestStep"].ColumnName = "测试阶段(交调)";

            if (myTable.Columns.Contains("DarkroomNum"))
                myTable.Columns["DarkroomNum"].ColumnName = "暗室号";

            if (myTable.Columns.Contains("PIMPass"))
                myTable.Columns["PIMPass"].ColumnName = "判定(交调)";

            if (myTable.Columns.Contains("MaxPIMValue"))
                myTable.Columns["MaxPIMValue"].ColumnName = "MAX交调";

            return myTable;
        } 
        
    }
}
